#ifndef _LISTNODE_H
#define _LISTNODE_H

#include "list.h"
#include "nodebuf.h"
#include "stdint.h"

#include "../circuit_node/circuit_node.h"


#ifdef __cplusplus
extern "C" {
#endif


/*===========================[Defines]=======================================*/
/*===========================[Macros]========================================*/
/*===========================[Typedef]=======================================*/

typedef enum
{
    HEAD_ADD,   /**> 头插 */
    TAIL_ADD    /**> 尾插 */
}insert_order_t;


typedef enum
{
    POSI_READ = 0,  /**> 正序 */
    REVER_READ  /**> 逆序 */
}read_order_t;



/**
 * @brief 链表头
 * 
 */
typedef struct 
{
    struct list_head list;
    struct nodebuf_t listbuf; // buffer in list
} list_head_node;


/*********************91A上报事件 链表************************* */
/**
 * @brief 91A中的设备地址
 *      仅局限在91A中是这样设置地址的，
 *      所以该结构体就限制在91A中。
 */
typedef struct 
{
    uint8_t master_index;  /**> 主机号 */
    uint16_t relay_index;   /**> 中继号，中继号==0X5AA5：无效 */
    uint8_t node_index;    /**> 节点号 */
} mod_91A_dev_addr_t;

/**
 * @brief 需要在界面显示的上报数据
 * 
 */
typedef struct 
{
    mod_91A_dev_addr_t      dev_addr;   /**> 设备地址 */
    uint32_t                evt_type;   /**> 事件类型 */
    uint64_t                occur_time; /**> 发生时间，世纪秒 */
} report_data_t;


/**
 * @brief 上报信息节点,
 *      往gas_zone_list_t中挂
 * 
 */
typedef struct 
{
    struct list_head        list;       /**> 链表指针，要求该项为首成员 */
    report_data_t           data;       /**> 91A上报的信息 */
} LIST_NODE_TYPE(REPORT_DATA_91A);

/*===========================[Global Prototypes]=============================*/

void list_init_with_buff(list_head_node *lists, void *buf, int buflen, uint16_t node_bytes );
uint8_t free_list_node(list_head_node *lists);
uint16_t get_list_num(list_head_node *lists);


/** 用于 91a 上报事件的链表操作 */
uint8_t LIST_FREE(REPORT_DATA_91A)(list_head_node *lists);
void   LIST_WRITE(REPORT_DATA_91A) (list_head_node *lists, insert_order_t local, report_data_t evt);
uint8_t LIST_READ(REPORT_DATA_91A)(list_head_node *lists, read_order_t order, uint16_t num, report_data_t *evt) ;
uint8_t LIST_DELETE(REPORT_DATA_91A)(list_head_node *lists,report_data_t evt);
uint8_t LIST_DELETE_SOME(REPORT_DATA_91A)(\
                        list_head_node *lists,  \
                        read_order_t order,     \
                        uint16_t delete_num);







#ifdef __cplusplus
}
#endif

#endif





